Code coverage report for src/array-observation.js

Statements: 55.68% (49 / 88)      Branches: 45.83% (11 / 24)      Functions: 58.33% (14 / 24)      Lines: 54.32% (44 / 81)      Ignored: none     

All files » src/ » array-observation.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 1771     1   1   9   1   1 9 9           1   1   1   1 1     1   1 1           1   1                                                                                                                                                           1     1 1 9   9 9     1 9   9   9 9 9     9   9 9 9 9         1       1 10       10 10   10 10       10         1          
System.register(['./environment', './array-change-records', './collection-observation'], function (_export) {
  'use strict';
 
  var hasArrayObserve, projectArraySplices, ModifyCollectionObserver, CollectionLengthObserver, arrayProto, ModifyArrayObserver, ArrayObserveObserver;
 
  _export('getArrayObserver', getArrayObserver);
 
  function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 
  function _inherits(subClass, superClass) { Iif (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); Eif (superClass) subClass.__proto__ = superClass; }
 
  function getArrayObserver(taskQueue, array) {
    Eif (hasArrayObserve) {
      return new ArrayObserveObserver(array);
    } else {
      return ModifyArrayObserver.create(taskQueue, array);
    }
  }
 
  return {
    setters: [function (_environment) {
      hasArrayObserve = _environment.hasArrayObserve;
    }, function (_arrayChangeRecords) {
      projectArraySplices = _arrayChangeRecords.projectArraySplices;
    }, function (_collectionObservation) {
      ModifyCollectionObserver = _collectionObservation.ModifyCollectionObserver;
      CollectionLengthObserver = _collectionObservation.CollectionLengthObserver;
    }],
    execute: function () {
      arrayProto = Array.prototype;
 
      ModifyArrayObserver = (function (_ModifyCollectionObserver) {
        function ModifyArrayObserver(taskQueue, array) {
          _classCallCheck(this, ModifyArrayObserver);
 
          _ModifyCollectionObserver.call(this, taskQueue, array);
        }
 
        _inherits(ModifyArrayObserver, _ModifyCollectionObserver);
 
        ModifyArrayObserver.create = function create(taskQueue, array) {
          var observer = new ModifyArrayObserver(taskQueue, array);
 
          array['pop'] = function () {
            var methodCallResult = arrayProto['pop'].apply(array, arguments);
            observer.addChangeRecord({
              type: 'delete',
              object: array,
              name: array.length,
              oldValue: methodCallResult
            });
            return methodCallResult;
          };
 
          array['push'] = function () {
            var methodCallResult = arrayProto['push'].apply(array, arguments);
            observer.addChangeRecord({
              type: 'splice',
              object: array,
              index: array.length - arguments.length,
              removed: [],
              addedCount: arguments.length
            });
            return methodCallResult;
          };
 
          array['reverse'] = function () {
            var oldArray = array.slice();
            var methodCallResult = arrayProto['reverse'].apply(array, arguments);
            observer.reset(oldArray);
            return methodCallResult;
          };
 
          array['shift'] = function () {
            var methodCallResult = arrayProto['shift'].apply(array, arguments);
            observer.addChangeRecord({
              type: 'delete',
              object: array,
              name: 0,
              oldValue: methodCallResult
            });
            return methodCallResult;
          };
 
          array['sort'] = function () {
            var oldArray = array.slice();
            var methodCallResult = arrayProto['sort'].apply(array, arguments);
            observer.reset(oldArray);
            return methodCallResult;
          };
 
          array['splice'] = function () {
            var methodCallResult = arrayProto['splice'].apply(array, arguments);
            observer.addChangeRecord({
              type: 'splice',
              object: array,
              index: arguments[0],
              removed: methodCallResult,
              addedCount: arguments.length > 2 ? arguments.length - 2 : 0
            });
            return methodCallResult;
          };
 
          array['unshift'] = function () {
            var methodCallResult = arrayProto['unshift'].apply(array, arguments);
            observer.addChangeRecord({
              type: 'splice',
              object: array,
              index: 0,
              removed: [],
              addedCount: arguments.length
            });
            return methodCallResult;
          };
 
          return observer;
        };
 
        return ModifyArrayObserver;
      })(ModifyCollectionObserver);
 
      ArrayObserveObserver = (function () {
        function ArrayObserveObserver(array) {
          _classCallCheck(this, ArrayObserveObserver);
 
          this.array = array;
          this.callbacks = [];
        }
 
        ArrayObserveObserver.prototype.subscribe = function subscribe(callback) {
          var _this = this;
 
          var callbacks = this.callbacks;
 
          Eif (callbacks.length === 0) {
            this.handler = this.handleChanges.bind(this);
            Array.observe(this.array, this.handler);
          }
 
          callbacks.push(callback);
 
          return function () {
            callbacks.splice(callbacks.indexOf(callback), 1);
            Eif (callbacks.length === 0) {
              Array.unobserve(_this.array, _this.handler);
            }
          };
        };
 
        ArrayObserveObserver.prototype.getLengthObserver = function getLengthObserver() {
          return this.lengthObserver || (this.lengthObserver = new CollectionLengthObserver(this.array));
        };
 
        ArrayObserveObserver.prototype.handleChanges = function handleChanges(changeRecords) {
          var callbacks = this.callbacks,
              i = callbacks.length,
              splices;
 
          Eif (i) {
            splices = projectArraySplices(this.array, changeRecords);
 
            while (i--) {
              callbacks[i](splices);
            }
          }
 
          Iif (this.lengthObserver) {
            this.lengthObserver.call(this.array.length);
          }
        };
 
        return ArrayObserveObserver;
      })();
    }
  };
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL2JpbmRpbmcvc3JjL2FycmF5LW9ic2VydmF0aW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztnR0FJSSxVQUFVLEVBVVIsbUJBQW1CLEVBb0ZuQixvQkFBb0I7OzhCQTVGVixnQkFBZ0I7Ozs7OztBQUF6QixXQUFTLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUM7QUFDaEQsUUFBRyxlQUFlLEVBQUM7QUFDakIsYUFBTyxJQUFJLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3hDLE1BQUk7QUFDSCxhQUFPLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDckQ7R0FDRjs7OztxQ0FaTyxlQUFlOztnREFDZixtQkFBbUI7O3dEQUNuQix3QkFBd0I7d0RBQUUsd0JBQXdCOzs7QUFFdEQsZ0JBQVUsR0FBRyxLQUFLLENBQUMsU0FBUzs7QUFVMUIseUJBQW1CO0FBQ1osaUJBRFAsbUJBQW1CLENBQ1gsU0FBUyxFQUFFLEtBQUssRUFBQztnQ0FEekIsbUJBQW1COztBQUVyQiwrQ0FBTSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDekI7O2tCQUhHLG1CQUFtQjs7QUFBbkIsMkJBQW1CLENBS2hCLE1BQU0sR0FBQSxnQkFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDO0FBQzdCLGNBQUksUUFBUSxHQUFHLElBQUksbUJBQW1CLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDOztBQUV6RCxlQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsWUFBVTtBQUN2QixnQkFBSSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNqRSxvQkFBUSxDQUFDLGVBQWUsQ0FBQztBQUN4QixrQkFBSSxFQUFF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QkFBaUIsR0FBQSw2QkFBRTtBQUNqQixpQkFBTyxJQUFJLENBQUMsY0FBYyxLQUFLLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUEsQUFBQyxDQUFDO1NBQ2hHOztBQTFCRyw0QkFBb0IsV0E0QnhCLGFBQWEsR0FBQSx1QkFBQyxhQUFhLEVBQUM7QUFDMUIsY0FBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVM7Y0FDMUIsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNO2NBQ3BCLE9BQU8sQ0FBQzs7QUFFWixjQUFHLENBQUMsRUFBQztBQUNILG1CQUFPLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQzs7QUFFekQsbUJBQU0sQ0FBQyxFQUFFLEVBQUU7QUFDVCx1QkFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3ZCO1dBQ0Y7O0FBRUQsY0FBRyxJQUFJLENBQUMsY0FBYyxFQUFDO0FBQ3JCLGdCQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1dBQzdDO1NBQ0Y7O2VBNUNHLG9CQUFvQiIsImZpbGUiOiIvVXNlcnMvRWlzZW5iZXJnRWZmZWN0L0RvY3VtZW50cy9HaXRIdWIvVGhlIER1cmFuZGFsIFByb2plY3QvYXVyZWxpYS9iaW5kaW5nL3NyYy9hcnJheS1vYnNlcnZhdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aGFzQXJyYXlPYnNlcnZlfSBmcm9tICcuL2Vudmlyb25tZW50JztcbmltcG9ydCB7cHJvamVjdEFycmF5U3BsaWNlc30gZnJvbSAnLi9hcnJheS1jaGFuZ2UtcmVjb3Jkcyc7XG5pbXBvcnQge01vZGlmeUNvbGxlY3Rpb25PYnNlcnZlciwgQ29sbGVjdGlvbkxlbmd0aE9ic2VydmVyfSBmcm9tICcuL2NvbGxlY3Rpb24tb2JzZXJ2YXRpb24nO1xuXG52YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFycmF5T2JzZXJ2ZXIodGFza1F1ZXVlLCBhcnJheSl7XG4gIGlmKGhhc0FycmF5T2JzZXJ2ZSl7XG4gICAgcmV0dXJuIG5ldyBBcnJheU9ic2VydmVPYnNlcnZlcihhcnJheSk7XG4gIH1lbHNle1xuICAgIHJldHVybiBNb2RpZnlBcnJheU9ic2VydmVyLmNyZWF0ZSh0YXNrUXVldWUsIGFycmF5KTtcbiAgfVxufVxuXG5jbGFzcyBNb2RpZnlBcnJheU9ic2VydmVyIGV4dGVuZHMgTW9kaWZ5Q29sbGVjdGlvbk9ic2VydmVyIHtcbiAgY29uc3RydWN0b3IodGFza1F1ZXVlLCBhcnJheSl7XG4gICAgc3VwZXIodGFza1F1ZXVlLCBhcnJheSk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlKHRhc2tRdWV1ZSwgYXJyYXkpe1xuICAgIHZhciBvYnNlcnZlciA9IG5ldyBNb2RpZnlBcnJheU9ic2VydmVyKHRhc2tRdWV1ZSwgYXJyYXkpO1xuXG4gICAgYXJyYXlbJ3BvcCddID0gZnVuY3Rpb24oKXtcbiAgICAgIHZhciBtZXRob2RDYWxsUmVzdWx0ID0gYXJyYXlQcm90b1sncG9wJ10uYXBwbHkoYXJyYXksIGFyZ3VtZW50cyk7XG4gICAgICBvYnNlcnZlci5hZGRDaGFuZ2VSZWNvcmQoe1xuICAgICAgIHR5cGU6ICdkZWxldGUnLFxuICAgICAgIG9iamVjdDogYXJyYXksXG4gICAgICAgbmFtZTogYXJyYXkubGVuZ3RoLFxuICAgICAgIG9sZFZhbHVlOiBtZXRob2RDYWxsUmVzdWx0XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBtZXRob2RDYWxsUmVzdWx0O1xuICAgIH1cblxuICAgIGFycmF5WydwdXNoJ10gPSBmdW5jdGlvbigpe1xuICAgICAgdmFyIG1ldGhvZENhbGxSZXN1bHQgPSBhcnJheVByb3RvWydwdXNoJ10uYXBwbHkoYXJyYXksIGFyZ3VtZW50cyk7XG4gICAgICBvYnNlcnZlci5hZGRDaGFuZ2VSZWNvcmQoe1xuICAgICAgIHR5cGU6ICdzcGxpY2UnLFxuICAgICAgIG9iamVjdDogYXJyYXksXG4gICAgICAgaW5kZXg6IGFycmF5Lmxlbmd0aCAtIGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgcmVtb3ZlZDogW10sXG4gICAgICAgYWRkZWRDb3VudDogYXJndW1lbnRzLmxlbmd0aFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWV0aG9kQ2FsbFJlc3VsdDtcbiAgICB9XG5cbiAgICBhcnJheVsncmV2ZXJzZSddID0gZnVuY3Rpb24oKXtcbiAgICAgIHZhciBvbGRBcnJheSA9IGFycmF5LnNsaWNlKCk7XG4gICAgICB2YXIgbWV0aG9kQ2FsbFJlc3VsdCA9IGFycmF5UHJvdG9bJ3JldmVyc2UnXS5hcHBseShhcnJheSwgYXJndW1lbnRzKTtcbiAgICAgIG9ic2VydmVyLnJlc2V0KG9sZEFycmF5KTtcbiAgICAgIHJldHVybiBtZXRob2RDYWxsUmVzdWx0O1xuICAgIH1cblxuICAgIGFycmF5WydzaGlmdCddID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbWV0aG9kQ2FsbFJlc3VsdCA9IGFycmF5UHJvdG9bJ3NoaWZ0J10uYXBwbHkoYXJyYXksIGFyZ3VtZW50cyk7XG4gICAgICBvYnNlcnZlci5hZGRDaGFuZ2VSZWNvcmQoe1xuICAgICAgIHR5cGU6ICdkZWxldGUnLFxuICAgICAgIG9iamVjdDogYXJyYXksXG4gICAgICAgbmFtZTogMCxcbiAgICAgICBvbGRWYWx1ZTogbWV0aG9kQ2FsbFJlc3VsdFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWV0aG9kQ2FsbFJlc3VsdFxuICAgIH07XG5cbiAgICBhcnJheVsnc29ydCddID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgb2xkQXJyYXkgPSBhcnJheS5zbGljZSgpO1xuICAgICAgdmFyIG1ldGhvZENhbGxSZXN1bHQgPSBhcnJheVByb3RvWydzb3J0J10uYXBwbHkoYXJyYXksIGFyZ3VtZW50cyk7XG4gICAgICBvYnNlcnZlci5yZXNldChvbGRBcnJheSk7XG4gICAgICByZXR1cm4gbWV0aG9kQ2FsbFJlc3VsdDtcbiAgICB9O1xuXG4gICAgYXJyYXlbJ3NwbGljZSddID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbWV0aG9kQ2FsbFJlc3VsdCA9IGFycmF5UHJvdG9bJ3NwbGljZSddLmFwcGx5KGFycmF5LCBhcmd1bWVudHMpO1xuICAgICAgb2JzZXJ2ZXIuYWRkQ2hhbmdlUmVjb3JkKHtcbiAgICAgICB0eXBlOiAnc3BsaWNlJyxcbiAgICAgICBvYmplY3Q6IGFycmF5LFxuICAgICAgIGluZGV4OiBhcmd1bWVudHNbMF0sXG4gICAgICAgcmVtb3ZlZDogbWV0aG9kQ2FsbFJlc3VsdCxcbiAgICAgICBhZGRlZENvdW50OiBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50cy5sZW5ndGggLSAyIDogMFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWV0aG9kQ2FsbFJlc3VsdDtcbiAgICB9O1xuXG4gICAgYXJyYXlbJ3Vuc2hpZnQnXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG1ldGhvZENhbGxSZXN1bHQgPSBhcnJheVByb3RvWyd1bnNoaWZ0J10uYXBwbHkoYXJyYXksIGFyZ3VtZW50cyk7XG4gICAgICBvYnNlcnZlci5hZGRDaGFuZ2VSZWNvcmQoe1xuICAgICAgIHR5cGU6ICdzcGxpY2UnLFxuICAgICAgIG9iamVjdDogYXJyYXksXG4gICAgICAgaW5kZXg6IDAsXG4gICAgICAgcmVtb3ZlZDogW10sXG4gICAgICAgYWRkZWRDb3VudDogYXJndW1lbnRzLmxlbmd0aFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWV0aG9kQ2FsbFJlc3VsdDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG9ic2VydmVyO1xuICB9XG59XG5cbmNsYXNzIEFycmF5T2JzZXJ2ZU9ic2VydmVyIHtcbiAgY29uc3RydWN0b3IoYXJyYXkpe1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbiAgICB0aGlzLmNhbGxiYWNrcyA9IFtdO1xuICB9XG5cbiAgc3Vic2NyaWJlKGNhbGxiYWNrKXtcbiAgICB2YXIgY2FsbGJhY2tzID0gdGhpcy5jYWxsYmFja3M7XG5cbiAgICBpZihjYWxsYmFja3MubGVuZ3RoID09PSAwKXtcbiAgICAgIHRoaXMuaGFuZGxlciA9IHRoaXMuaGFuZGxlQ2hhbmdlcy5iaW5kKHRoaXMpO1xuICAgICAgQXJyYXkub2JzZXJ2ZSh0aGlzLmFycmF5LCB0aGlzLmhhbmRsZXIpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjYWxsYmFja3Muc3BsaWNlKGNhbGxiYWNrcy5pbmRleE9mKGNhbGxiYWNrKSwgMSk7XG4gICAgICBpZiAoY2FsbGJhY2tzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBBcnJheS51bm9ic2VydmUodGhpcy5hcnJheSwgdGhpcy5oYW5kbGVyKVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBnZXRMZW5ndGhPYnNlcnZlcigpe1xuICAgIHJldHVybiB0aGlzLmxlbmd0aE9ic2VydmVyIHx8ICh0aGlzLmxlbmd0aE9ic2VydmVyID0gbmV3IENvbGxlY3Rpb25MZW5ndGhPYnNlcnZlcih0aGlzLmFycmF5KSk7XG4gIH1cblxuICBoYW5kbGVDaGFuZ2VzKGNoYW5nZVJlY29yZHMpe1xuICAgIHZhciBjYWxsYmFja3MgPSB0aGlzLmNhbGxiYWNrcyxcbiAgICAgICAgaSA9IGNhbGxiYWNrcy5sZW5ndGgsXG4gICAgICAgIHNwbGljZXM7XG5cbiAgICBpZihpKXtcbiAgICAgIHNwbGljZXMgPSBwcm9qZWN0QXJyYXlTcGxpY2VzKHRoaXMuYXJyYXksIGNoYW5nZVJlY29yZHMpO1xuXG4gICAgICB3aGlsZShpLS0pIHtcbiAgICAgICAgY2FsbGJhY2tzW2ldKHNwbGljZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKHRoaXMubGVuZ3RoT2JzZXJ2ZXIpe1xuICAgICAgdGhpcy5sZW5ndGhPYnNlcnZlci5jYWxsKHRoaXMuYXJyYXkubGVuZ3RoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==